package cn.fj.game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;



public class MyGameFrame extends Frame{   //这里继承了JFrame已经不那么闪烁了  但是还是有点闪
	Image   planeImg  = GameUtil.getImage("images/plane.png");
	Image   bg  = GameUtil.getImage("images/bg.jpg");    //图片的格式一定要对
	Plane p=new Plane(planeImg,250,250);   //这个对象定义在方法外面可以理解为全局对象
//	Shell shell=new Shell();
	Shell[]  shells=new Shell[50];   //首先创建炮弹的长度
	Explode bao;//声明爆炸的对象，其实可以理解为变量，这里没有赋值创建新的对象
	
	
	
	
	@Override      //这个方法是自动调用的
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(bg, 0, 0, null);
		p.drawSelf(g);    //这个方法里面就可以使用p这个对象
		
		for(int i=0;i<shells.length;i++) {
			shells[i].draw(g);   //画炮弹    画50个炮弹
			boolean peng=shells[i].getRect().intersects(p.getRect());
			if(peng) {
//				System.out.println("相撞了！！！");
				p.live=false;
				if(bao==null) {
					bao=new Explode(p.x,p.y);  //在飞机爆炸的位置创建坐标
				}
				bao.draw(g);
				
			}
		}
		
	}
	//这个线程可以帮助我们反复的重画窗口     
	class PaintThread extends  Thread{   //这个是内部类可以直接调用外部类的属性和方法
		@Override
		public void run() {
			while(true) {
				repaint();   //重画窗口
//				System.out.println("窗口重画");
				try {
					Thread.sleep(40);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}     //4oms变化一次图片
			}
			
		}
	}
	//定义键盘监听的内部类
	class KeyMonitor   extends KeyAdapter{

		@Override
		public void keyPressed(KeyEvent e) {
//			System.out.println("按下:"+e.getKeyCode());  //首先通过按键盘被事件监听到，然后调用plane的方法
			p.addDirection(e);
		}

		@Override
		public void keyReleased(KeyEvent e) {  
//			System.out.println("抬起:"+e.getKeyCode());
			p.minusDirection(e);

		}   //KeyAdapter是一个适配器
		//在这里面我们需要重写两个方法    按键和释放键的方法
		
		
	}
	
	
	//初始化窗口
	public void lanuchFrame() {
		this.setTitle("画图");
		this.setSize(Constant.GAME_WIDTH,Constant.GAME_WIDTH);
		this.setLocation(300,300);
		this.setVisible(true);   //设置这个窗口是可见的
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);    //设置窗口点击X按钮结束进程
			}
		});
		//启动线程我们都是在初始化窗口进行的
		new PaintThread().start();
		addKeyListener(new KeyMonitor());  //给窗口增加键盘的监听
		for(int i=0;i<shells.length;i++) {
			shells[i]=new Shell();   //在初始化窗口创建50个炮弹的对象    但是还没有画在上面
		}
		
	}
	public static void main(String[] args) {   //而且一定要理解了main方法是随着类的加载而加载了，这里如果要引用外面的对象一定要将对象修饰为静态的
		MyGameFrame f=new MyGameFrame();
		f.lanuchFrame();
		}
	
	private Image offScreenImage = null;
	 
	public void update(Graphics g) {
	    if(offScreenImage == null)
	        offScreenImage = this.createImage(500,500);//这是游戏窗口的宽度和高度
	     
	    Graphics gOff = offScreenImage.getGraphics();
	    paint(gOff);
	    g.drawImage(offScreenImage, 0, 0, null);
	}   

	
	
}
